package Persistencia.Entidad;

import java.sql.Date;
import java.util.ArrayList;
import java.util.List;

import Excepcion.EmailParticipanteExistenteException;
import Excepcion.NombreParticipanteExistenteException;
import Persistencia.Entidad.LugarDeCompetencia;

public class Competencia {
	
	private Integer id;
	private String nombre;
	private Date fechaDeInicio;
	private Date fechaDeFinalizacion;
	private Integer puntosPorEmpate;
	private Integer puntosPorVictoria;
	private Integer puntosPorPresencia;
	private Boolean eliminada;
	private EstadoDeCompetencia estadoDeCompetencia;
	private Deporte deporte;
	private ModalidadDeCompetencia modalidadDeCompetencia;
	private Reglamento reglamento;
	private List<Participante> participantes = new ArrayList<Participante>();
    private List<Fecha> fechas = new ArrayList<Fecha>();
    private FormaDePuntuacion formaDePuntuacion;
    private List<Disponibilidad> disponibilidades = new ArrayList<Disponibilidad>();
    private Integer cantidadSets;
    private Integer puntosPorAusencia;
    private Usuario usuario;
    
    
    //Constructores
    public Competencia() {
    	
    }
    public Competencia(String nombreCompetencia, Usuario usuario) {
    	this.nombre = nombreCompetencia;
    	this.usuario = usuario;
    	this.eliminada = false;
    }
    //Fin Constructores
    
    //Setters
	public void setId(Integer id) {
		this.id = id;
	}
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	public void setFechaDeInicio(Date fechaDeInicio) {
		this.fechaDeInicio = fechaDeInicio;
	}
	public void setPuntosPorEmpate(Integer puntosPorEmpate) {
		this.puntosPorEmpate = puntosPorEmpate;
	}
	public void setFechaDeFinalizacion(Date fechaDeFinalizacion) {
		this.fechaDeFinalizacion = fechaDeFinalizacion;
	}
	public void setPuntosPorVictoria(Integer puntosPorVictoria) {
		this.puntosPorVictoria = puntosPorVictoria;
	}
	public void setPuntosPorPresencia(Integer puntosPorPresencia) {
		this.puntosPorPresencia = puntosPorPresencia;
	}
	public void setEliminada(Boolean eliminada) {
		this.eliminada = eliminada;
	}
	public void setEstadoDeCompetencia(EstadoDeCompetencia estadoDeCompetencia) {
		this.estadoDeCompetencia = estadoDeCompetencia;
	}
	public void setFechas(List<Fecha> fechas) {
		this.fechas = fechas;
	}
	public void setFormaDePuntuacion(FormaDePuntuacion formaDePuntuacion) {
		this.formaDePuntuacion = formaDePuntuacion;
	}
	public void setDisponibilidades(List<Disponibilidad> disponibilidades) {
		this.disponibilidades = disponibilidades;
	}
	public void setDeporte(Deporte deporte) {
		this.deporte = deporte;
	}
	public void setModalidadDeCompetencia(ModalidadDeCompetencia modalidadDeCompetencia) {
		this.modalidadDeCompetencia = modalidadDeCompetencia;
	}
	public void setReglamento(Reglamento reglamento) {
		this.reglamento = reglamento;
	}
	public void setReglasDePuntuacion(FormaDePuntuacion formaDePuntuacion, int puntosPorVictoria,
			int puntosPorEmpate, int sets, int puntosPorPresencia, int puntosPorAusencia) 
	{
		this.formaDePuntuacion=formaDePuntuacion;
		this.puntosPorVictoria=puntosPorVictoria;
		this.puntosPorEmpate=puntosPorEmpate;
		this.cantidadSets=sets;
		this.puntosPorPresencia=puntosPorPresencia;
		this.puntosPorAusencia=puntosPorAusencia;
		
	}
	public void setToCreada(EstadoDeCompetencia estado) {
		estadoDeCompetencia=estado;
		
	}
	public void setParticipantes(List<Participante> participantes) {
		this.participantes = participantes;
	}
	public void setToDisputa(EstadoDeCompetencia estado) {
		estadoDeCompetencia=estado;		
	}
	public void setToFinalizada(EstadoDeCompetencia estado) {
		estadoDeCompetencia=estado;
	}
	public void setCantidadSets(Integer cantidadSets) {
		this.cantidadSets = cantidadSets;
	}
	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}
	public void setPuntosPorAusencia(Integer puntosPorAusencia) {
		this.puntosPorAusencia = puntosPorAusencia;
	}
	//Fin Setters
    
    //Getters
	public Integer getId() {
		return id;
	}
	public String getNombre() {
		return nombre;
	}
	public Date getFechaDeInicio() {
		return fechaDeInicio;
	}
	public Date getFechaDeFinalizacion() {
		return fechaDeFinalizacion;
	}
	public Integer getPuntosPorEmpate() {
		return puntosPorEmpate;
	}
	public Integer getPuntosPorVictoria() {
		return puntosPorVictoria;
	}
	public Integer getPuntosPorPresencia() {
		return puntosPorPresencia;
	}
	public EstadoDeCompetencia getEstadoDeCompetencia() {
		return estadoDeCompetencia;
	}
	public Boolean getEliminada() {
		return eliminada;
	}
	public List<Fecha> getFechas() {
		return fechas;
	}
	public FormaDePuntuacion getFormaDePuntuacion() {
		return formaDePuntuacion;
	}
	public Deporte getDeporte() {
		return deporte;
	}
	public List<Disponibilidad> getDisponibilidades() {
		List<Disponibilidad> d=new ArrayList<Disponibilidad>();
		d.addAll(disponibilidades);
		return d;
	}
	public ModalidadDeCompetencia getModalidadDeCompetencia() {
		return modalidadDeCompetencia;
	}
	public Reglamento getReglamento() {
		return reglamento;
	}
	public ArrayList<Partido> getListPartidos() {
		ArrayList<Partido> partidos= new ArrayList<Partido>();
		for(int i=0;i<fechas.size();i++){
			partidos.addAll(fechas.get(i).getPartidos());
		}
		return partidos;
	}
	public List<Participante> getParticipantes() {
		List<Participante> lista=new ArrayList<Participante>();
		lista.addAll(participantes);
		
		return lista;
	}
	public String getNombreParticipante(int j) {
		for(int i=0;i<participantes.size();i++){
			if(participantes.get(i).getId()==j){
			return participantes.get(i).getNombre();
			}
		}
		return "";
	}
	public int getPuntosPorAusencia() {
		return puntosPorAusencia;
	}
	public int getIdEstadoDeCompetencia() {
		return estadoDeCompetencia.getId(); 
	}
	public int getCantidadDeSets() {
		return this.cantidadSets;
	}
	public Integer getCantidadSets() {
		return cantidadSets;
	}
	public Usuario getUsuario() {
		return usuario;
	}
	//Fin Getters
	
	//Adds
	public void addDisponibilidad(Disponibilidad disponibilidad) {
		this.disponibilidades.add(disponibilidad);
	}
	public void agregarParticipante(Participante participante) {
		participantes.add(participante);
		
	}
	public void addFecha(Fecha fecha) {
		fechas.add(fecha);
	}
	public void addEstado(EstadoDeCompetencia estado) {
		
		estadoDeCompetencia=estado;
	}
	//Fin Adds

	//Preguntas
	public Boolean existenDatos(String nombreEquipo,String correo )
			throws NombreParticipanteExistenteException, EmailParticipanteExistenteException
	{
		for(int i=0;i<participantes.size();i++){
			if(nombreEquipo.toUpperCase().equals(participantes.get(i).getNombre().toUpperCase())){
				throw new NombreParticipanteExistenteException();
			}
			if(correo.toUpperCase().equals(participantes.get(i).getDireccionEmail().toUpperCase())){
				throw new EmailParticipanteExistenteException();
			}
		}
		return false;
	}
	public Boolean esPuntuacion() {
		if (formaDePuntuacion.equalTipoPuntuacion(FormaDePuntuacion.PUNTUACION)){
			return true;
		}
		return false;
	}
	public Boolean esSet()
	{
		if (formaDePuntuacion.equalTipoPuntuacion(FormaDePuntuacion.SETS))
			return true;
		return false;
	}
	public Boolean esResultadoFinal()
	{
		if (formaDePuntuacion.equalTipoPuntuacion(FormaDePuntuacion.RESULTADO_FINAL))
			return true;
		return false;
	}
	public Boolean hayDisponibilidad(int cantidadDeParticipantes) {
		int disponibilidadTotal=0,partidosPorFecha;
		for(int i=0;i<disponibilidades.size();i++){
			disponibilidadTotal=disponibilidadTotal+ disponibilidades.get(i).getCantidadDePartidosDisponibles();
		}
		

		
		if(cantidadDeParticipantes>1){
			if((cantidadDeParticipantes %2) !=0){
				cantidadDeParticipantes--;
			}
			partidosPorFecha=cantidadDeParticipantes/2;
			if(disponibilidadTotal>=partidosPorFecha){
				return true;
			}
		}
		return false;
	}
	public Boolean esModoEliminacion() {
		return modalidadDeCompetencia.eliminacion();
	}
	public Boolean ultimoEncuentro() {
		
		for(int i=0;i<fechas.size();i++){
			for(int j=0;j<fechas.get(i).getPartidos().size();j++){
				if(!fechas.get(i).getPartidos().get(j).existeResultado())
				{
					return false;
				}
			}
		}
		return true;
	}
	//Fin Preguntas
	
	//Otros
	public void sumarDisponibilidad(LugarDeCompetencia lugar) {

		for(int i=0;i<disponibilidades.size();i++){
			if(disponibilidades.get(i).getLugarDeCompetencia().getId()==lugar.getId()){
				disponibilidades.get(i).sumar();
			}
		}
	}
	public void eliminarFechas() {
		ArrayList<Fecha> temporal=new ArrayList<Fecha>();
		this.fechas.clear();
		this.fechas.addAll(temporal);

	}
	public void updateFecha(Fecha fecha) {
		for(int i=0;i<fechas.size();i++){
			if(fechas.get(i).getId()==fecha.getId()){
				fechas.set(i,fecha);				
			}
		}
	}

	//Fin Otros
	public List<Partido> getProximosPartidos() {
		List<Partido> partidos=new ArrayList<Partido>();
		for(int i=0;i<fechas.size();i++){
			if(fechas.get(i).getEstadoDeFecha().getId()==EstadoDeFecha.CREADA){
				partidos=fechas.get(i).getPartidos();
				i=fechas.size();
			}

			if(fechas.get(i).getEstadoDeFecha().getId()==EstadoDeFecha.EN_PROCESO)
				{
				
					for(int j=0;j<fechas.get(i).getPartidos().size();j++){
						if(!fechas.get(i).getPartidos().get(j).existeResultado())
							partidos.add(fechas.get(i).getPartidos().get(j));
					}
					i=fechas.size();
				}
			
		}
		return partidos;
	}
}

